﻿using System.Collections.Generic;

namespace Kyoh.Lib.Excel
{
    /// <summary>グラデーションの色と位置を定義する <see cref="ColorStop"/> のコレクションです。</summary>
    public class ColorStopCollection : Component, IEnumerable<ColorStop>
    {
        private ColorStopCollection(object obj, Component parent)
            :base(obj, parent)
        {
        }

        /// <summary>Excel COM オブジェクトで、新しいインスタンスを初期化します。</summary>
        /// <param name="obj">Excel COM オブジェクト</param>
        /// <param name="parent">親となる <see cref="Component"/> オブジェクト。</param>
        internal static ColorStopCollection Create(object obj, Component parent)
        {
            return obj == null ? null : new ColorStopCollection(obj, parent);
        }

        /// <summary>要素の個数を取得します。</summary>
        public int Count
        {
            get { return (int)base.GetProperty("Count"); }
        }

        /// <summary>新しい位置を指定して <see cref="ColorStop"/> を追加します。</summary>
        /// <param name="position">追加する位置</param>
        /// <returns>追加した <see cref="ColorStop"/> オブジェクト。</returns>
        public ColorStop Add(double position)
        {
            return ColorStop.Create(base.InvokeMethod("Add", position), this);
        }

        /// <summary>すべての位置と色を表す <see cref="ColorStop"/> オブジェクトを削除します。</summary>
        public void Clear()
        {
            base.InvokeMethod("Clear");
        }

        /// <summary>インデックスを指定して、 <see cref="ColorStop"/> オブジェクトを取得します。</summary>
        public ColorStop this[int index]
        {
            get { return ColorStop.Create(base.GetProperty("Item", index), this); }
        }

        /// <summary>要素を列挙します。</summary>
        /// <returns>リストの要素である <see cref="ColorStop"/> を列挙する <see cref="IEnumerator{T}"/></returns>
        public IEnumerator<ColorStop> GetEnumerator()
        {
            var list = (System.Collections.IEnumerator)base.InvokeMethod("GetEnumerator");
            list.Reset();
            while (list.MoveNext())
                yield return ColorStop.Create(list.Current, this);
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            var list = (System.Collections.IEnumerator)base.InvokeMethod("GetEnumerator");
            list.Reset();
            while (list.MoveNext())
                yield return ColorStop.Create(list.Current, this);
        }
    }
}
